/*************************************************************************************
 *
 *  Revolution Engine
 *  Copyright (C) 2009 Felipe Apablaza
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 ************************************************************************************/

//---------------------------------------------------------
//
//  File:	IObjCreator.hpp
//  Desc:	Object creator interface. Used to extend the
//			object recycler capabilities with new objects
//			types at runtime.
//
//---------------------------------------------------------

#ifndef __REVENG_IOBJCREATOR_HPP__
#define __REVENG_IOBJCREATOR_HPP__

#include <RevEng/DataTypes.hpp>
#include <typeinfo>

namespace RevEng
{
	class IObject;

	class IObjCreator
	{
	public:
		virtual ~IObjCreator() = 0;

		//Instance a new object
		virtual IObject* New() = 0;

		//Return the RTTI from that new object
		virtual const std::type_info& GetTypeInfo() const = 0;

		//Return the implementation
		virtual Enum GetClassId() const = 0;
	};

	inline IObjCreator::~IObjCreator()
	{
	}

	//Simple generic implementation
	//TImplClass must be a derived class from IObject.
	template<typename TImplClass, Enum TClassId>
	class ObjCreator : public IObjCreator
	{
	public:
		virtual IObject* New()
		{
			return new TImplClass;
		}

		virtual Enum GetClassId() const
		{
			return TClassId;
		}

		virtual const std::type_info& GetTypeInfo() const
		{
			return typeid(TImplClass);
		}
	};
}

#endif	//__REVENG_IOBJCREATOR_HPP__
